package com.snow.useviewdemo.num;

import android.animation.ValueAnimator;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.animation.LinearInterpolator;

import java.text.DecimalFormat;

/**
 * author : zyt
 * e-mail : 632105276@qq.com
 * date   : 2019-09-28
 * desc   :
 */
public class RunNumTextView extends AppCompatTextView {
    private ValueAnimator mValueAnimator;
    private DecimalFormat mDf;
    private int animationTime = 1000;

    public RunNumTextView(Context context) {
        this(context, null);
    }

    public RunNumTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RunNumTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //格式化小数（保留小数点后两位）
        mDf = new DecimalFormat("0.00");
        initAnim();
    }

    /**
     * 设置数字格式
     *
     * @param decimalFormat 0 0.0 0.00 0.000 整数 一位小数点 两位小数点  三位小数点
     * @param animationTime 动画时间 毫秒
     */
    public void setDecimalFormat(String decimalFormat, int animationTime) {
        if (!TextUtils.isEmpty(decimalFormat)) {
            mDf = new DecimalFormat(decimalFormat);
        }
        if (animationTime > 0) {
            this.animationTime = animationTime;
            mValueAnimator.setDuration(animationTime);//动画时间为1秒
        }
    }

    /**
     * 初始化动画
     */
    private void initAnim() {
        mValueAnimator = ValueAnimator.ofFloat(0, 0);//由于金钱是小数所以这里使用ofFloat方法
        mValueAnimator.setDuration(animationTime);//动画时间为1秒
        mValueAnimator.setInterpolator(new LinearInterpolator());
        mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
                if (value > 0) {//当数值大于0的时候才赋值
                    setText(mDf.format(value));
                }
            }
        });
    }

    /**
     * 设置要显示的金钱
     *
     * @param money
     */
    public void setMoney(float money) {
        mValueAnimator.setFloatValues(0, money);//重新设置数值的变化区间
        mValueAnimator.start();//开启动画
    }

    /**
     * 取消动画和动画监听（优化内存）
     */
    public void cancle() {
        mValueAnimator.removeAllUpdateListeners();//清除监听事件
        mValueAnimator.cancel();//取消动画
    }
}